package com.goods.util;

import javax.servlet.ServletOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.lang.reflect.Field;
import java.util.List;

/**
 * Excel工具类
 * @author huangyanzhong
 * @date 2020-04-01
 */
public class ExcelUtil {

    /**
     * 导出
     * @param titles
     * @param datas
     * @param out
     * @param <T>
     * @throws Exception
     */
    public static <T> void export(String[] titles,String[] names, List<T> datas, ServletOutputStream out) throws Exception{
        if(titles.length!=names.length){
            throw new Exception("参数错误");
        }
        try{
             // 第一步，创建一个workbook，对应一个Excel文件
             HSSFWorkbook workbook = new HSSFWorkbook();
             // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
             HSSFSheet hssfSheet = workbook.createSheet("sheet1");
             // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
             HSSFRow row = hssfSheet.createRow(0);
            // 第四步，创建单元格，并设置值表头 设置表头居中
             HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
             //居中样式
             hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
             HSSFCell hssfCell = null;
             for (int i = 0; i < titles.length; i++) {
                 //列索引从0开始
                 hssfCell = row.createCell(i);
                 //列名
                 hssfCell.setCellValue(titles[i]);
                 //列居中显示
                 hssfCell.setCellStyle(hssfCellStyle);
             }

             for (int i = 0; i < datas.size(); i++) {
                 row = hssfSheet.createRow(i+1);
                 T record= datas.get(i);
                 for(int k=0;k<names.length;k++){
                     String value="";
                     Field field=record.getClass().getDeclaredField(names[k]);
                     if(field!=null){
                         field.setAccessible(true);
                         Object objVal=field.get(record);
                         if(objVal!=null){
                             value=objVal.toString();
                         }
                     }
                     // 第六步，创建单元格，并设置值
                     row.createCell(k).setCellValue(value);
                 }

             }
             // 第七步，将文件输出到客户端浏览器
            workbook.write(out);
         }catch(Exception e){
            throw new Exception("导出信息失败！");
         }finally {
            try {
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
         }
    }

}